/**
 * 权限混入
 */

import {
	permissionList
} from '@/common/util/constants.js'
import {
	mapActions,
	mapGetters
} from "vuex";
import store from '@/store'
export default {
	data() {
		return {
			standPermissions: '', // 权限列表
			// standPermissionsOld: '',  // 旧权限列表，暂无用

			...permissionList, // 引入权限常量名
		}
	},
	computed: {
		...mapGetters(['permission']),
	},
	created() {
		console.log('created===============>', this.permission)
		// console.log(this.TIMES++)
		// if(this.$assist.isInitedPermission) return
		// console.log('初始化第一次')

		//this._initstandPermissions() // 初始化权限列表
		// this.$assist.isInitedPermission = true
	},
	methods: {
		...mapActions(['setPermission']),
		// _on() {
		// 	return !!this.standPermissions
		// },
		// // 权限总开关，等待权限加载
		// _wait() {
		// 	return !!this.standPermissions
		// },

		/**
		 * 判断登陆用户是否有权限访问标签
		 * 适用场景：只适用于标签的渲染与否，例如：<view v-if="_has(['user'])"></view>
		 * 		无法用于控制函数
		 * 两个变量：1、后端权限列表 2、前端传入权限列表
		 * 例如：前端传入用户：['admin', 'user']
		 * 		后端权限列表：['admin', 'user', 'employee', 'manage']
		 * 匹配模式：完全匹配，例如['admin']=> true
		 * 		['admin','user']=> true
		 * 		['admin', 'user111']=> false
		 * @return {Boolean}
		 */
		/* ---------------update---start---------------------- */
		//附带表达式判断
		_has(permission) {
			/* let outMark = [];
			for (let i = 0; i < permission.length; i++) {
				let outItem = permission[i];
				let innerMark = false;
				for (let j = 0; j < this.permission.length; j++) {
					let innerItem = this.permission[j];
					if (outItem == innerItem) {
						innerMark = true;
						break;
					}
				}
				outMark.push(innerMark);
			}
			let result;
			if (mode == '&') {
				result = outMark[0];
				for (let k = 1; k < outMark.length; k++) {
					result &= outMark[k];
				}
			} else if (mode == '|') {
				result = outMark[0];
				for (let k = 1; k < outMark.length; k++) {
					result |= outMark[k];
				}
			}
			console.log('log1-->', permission)
			console.log('log2-->', this.standPermissions)
			console.log('log3-->', outMark)
			console.log('log4-->', result == 0 ? false : true)
				
			return result; */
			
			//去除空格
			//案例： tribune | learn | exam
			let trimPer = permission.replace(/\s+/g, "");	//tribune|learn|exam
			let pers = [],	//存放权限标识 ['tribune','learn','exam']
				perStr = []; //存放表达式标识 ['|','|']
			let len1, len2; //len1判断&是否存在 len2判断|是否存在
			while ((len1 = trimPer.indexOf('&')) != -1 | (len2 = trimPer.indexOf('|')) != -1) {
				//防止len1或者len2为-1
				if(len1 == -1 || len2 == -1){
					if(len1==-1){
						//说明下一个标识为|
						let temp = trimPer.substring(0, len2)
						trimPer = trimPer.substr(len2 + 1);
						//存放权限标识
						pers.push(temp);
						//存放表达式标识
						perStr.push('|')
					}else if(len2==-1){
						//说明下一个标识为&
						let temp = trimPer.substring(0, len1);
						trimPer = trimPer.substr(len1 + 1);
						//存放权限标识
						pers.push(temp);
						//存放表达式标识
						perStr.push('&')
					}else{
						//考虑一下为何走到这里
						console.log('err');
					}
					//判断&和|那个在前面
				}else if (len1 < len2) {
					//说明下一个标识为&
					let temp = trimPer.substring(0, len1);
					trimPer = trimPer.substr(len1 + 1);
					//存放权限标识
					pers.push(temp);
					//存放表达式标识
					perStr.push('&')
				} else if (len1 > len2) {
					//说明下一个标识为|
					let temp = trimPer.substring(0, len2);
					trimPer = trimPer.substr(len2 + 1);
					//存放权限标识
					pers.push(temp);
					//存放表达式标识
					perStr.push('|')
				} else {
					//考虑一下为何走到这里
					console.log('err');
				}
			}
			
			//不要忘记最后一个未判断的标识
			pers.push(trimPer);
			
			let outMark = [];
			//判断传入(处理后的)权限标识是否在权限列表中
			for (let i = 0; i < pers.length; i++) {
				let outItem = pers[i];
				let innerMark = false;
				for (let j = 0; j < this.permission.length; j++) {
					let innerItem = this.permission[j];
					if (outItem == innerItem) {
						innerMark = true;
						break;
					}
				}
				outMark.push(innerMark);
			}
			
			//根据表达式标识求出最终的boolean值
			let result = outMark[0];
			for (let k = 0; k < perStr.length; k++) {
				switch (perStr[k]) {
					case '&':
						result &= outMark[k+1];
						break;
					case '|':
						result |= outMark[k+1];
						break;
				}
			}
			//转换最终的表达式结果
			return result == 0 ? false : true;
			/* ---------------update---end---------------------- */
			// 预更新权限，下次生效

			// // 没有加载到远端权限列表
			// if (!this.standPermissions) {
			// 	// console.log(`[warn]:file(permission.js),func(_has)(远程权限列表未初始化)`)
			// 	return false
			// }

			// if(mode == '&'){
			// 	// 如果是数组
			// 	// this._initstandPermissions()
			// 	let flag = true
			// 	// if(param.length==1 && param[0]=='') flag = false

			// 	param.forEach(item => {
			// 		if (item == '') return flag = false
			// 		if (this.standPermissions.join('').indexOf(item) == -1) return flag = false
			// 	})

			// 	return flag

			// }

			// // console.log('arguments', arguments);
			// // 判断参数
			// // if (arguments.length > 0) {

			// // 	for (let key in arguments) {
			// // 		const param = arguments[key]

			// // 		if(typeof(param) == 'string'){
			// // 			if(param == '&'){
			// // 			}
			// // 			switch(param){
			// // 				case '&':
			// // 				break
			// // 			}
			// // 		}

			// // 		// 如果是数组
			// // 		if (typeof(param) == 'object') {
			// // 			// this._initstandPermissions()
			// // 			let flag = true
			// // 			// if(param.length==1 && param[0]=='') flag = false

			// // 			param.forEach(item => {
			// // 				if (item == '') return flag = false
			// // 				if (this.standPermissions.join('').indexOf(item) == -1) return flag = false
			// // 			})

			// // 			return flag
			// // 		}
			// // 	}
			// // }

			// return false

		},

		/**
		 * 远端获取权限列表
		 */
		_initstandPermissions() {
			// [服务器] 请求标准权限
			this.$http.get('/console/v1.Addons/AddonInstalledList').then(res => {
				// this.standPermissionsOld = this.standPermissions
				this.standPermissions = res.data.data
			})

			// new Promise((resolve, reject) => {
			// 	resolve(['admin', 'user', 'employee', 'manage'])
			// }).then(res => {
			// 	setTimeout(() => {
			// 		this.standPermissions = res
			// 	}, 1500)
			// })

		},

	},
}
